function genProps(attrs) {
  let str = '';
  for (let i = 0; i < attrs.length; i++) {
    let attr = attrs[i];
    // style 属性进行特殊处理
    // 目标 ： {id:"app",class:"appClass",style:{"color":" red"," font-size":" 15px"}}
    if (attr.name === 'style') {
      let obj = {};
      attr.value.split(';').forEach((item) => {
        const [key, val] = item.split(':');
        obj[key] = val;
      });
      attr.value = obj;
    }
    str += `${attr.name}:${JSON.stringify(attr.value)},`;
  }
  return `{${str.slice(0, -1)}}`;
}

// 匹配 {{ }} 表达式
const defaultTagRE = /\{\{((?:.|\r?\n)+?)\}\}/g;

function gen(node) {
  if (node.type === 1) {
    return generate(node);
  } else {
    const text = node.text;
    if (!defaultTagRE.test(text)) {
      // 没有双花括号
      return `_v(${JSON.stringify(text)})`;
    } else {
      let tokens = [];
      let match;
      defaultTagRE.lastIndex = 0;
      let lastIndex = 0;

      while ((match = defaultTagRE.exec(text))) {
        const index = match.index;
        if (index > lastIndex) {
          // 若有多个双花括号且中间有文本，截取两个双花括号的中间文本
          tokens.push(JSON.stringify(text.slice(lastIndex, index)));
        }
        tokens.push(`_s(${match[1].trim()})`);
        // 记录处理完双花括号后的 index
        lastIndex = index + match[0].length;
      }

      // 最后一个双花括号后面的文本
      if (text.length > lastIndex) {
        tokens.push(JSON.stringify(text.slice(lastIndex)));
      }

      return `_v(${tokens.join('+')})`;
    }
  }
}

function genChildren(children) {
  return children.map((child) => gen(child)).join(',');
}

// ast 对象转为 render 字符串
export function generate(ast) {
  const children = genChildren(ast.children);
  const renderCode = `_c('${ast.tag}',${ast.attrs.length ? `${genProps(ast.attrs)}` : 'null'}${
    ast.children.length ? `,${children}` : ''
  })`;
  return renderCode;
}
